package ongd.web;

import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

/**
 * Clase que implementa el propio Listener da la fase del ciclo de vida de 
 * nuestra aplicación.
 *
 * @author <a href="mailto:egi0002@alu.ubu.es">Elena García Iglesias</a>
 * @author <a href="mailto:cms0021@alu.ubu.es">Cristina Martínez Sanz</a>
 * @version 1.0 20120124
 *
 */
public class PhaseListenerImpl implements PhaseListener {
    
    /**
     * Método que maneja una notificación de que el procesamiento de una 
     * fase particular se acaba de terminar.
     * @param event Evento
     */
    @Override
    public void afterPhase(PhaseEvent event) {
    }

    /**
     * Método que maneja una notificación de que el procesamiento de una fase 
     * particular del ciclo de vida de procesamiento de solicitudes está a 
     * punto de comenzar.
     * @param event Evento
     */
    @Override
    public void beforePhase(PhaseEvent event) {
        FacesContext objFacesContext = null;
        String strViewId = null;
        String strNombreBean = null;
        Object ocpICicloVida = null;
        try {
            if (event.getPhaseId() == PhaseId.RENDER_RESPONSE) {
                objFacesContext = event.getFacesContext();
                strViewId = event.getFacesContext().getViewRoot().getViewId();
                if (strViewId.endsWith(".xhtml")) {
                    strNombreBean = obtenerNombreBean(strViewId);
                    ocpICicloVida =
                            objFacesContext.getApplication().createValueBinding("#{"
                            + strNombreBean + "}").getValue(objFacesContext);
                    if (ocpICicloVida == null) {
                        System.out.println("----------OnPageLoad cannotbe executed, no such managed bean:" + strNombreBean);
                    } else {
                        ((ICicloVida) ocpICicloVida).cargaInicial();
                    }
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * Método que devuelve el identificador de la fase de procesamiento de la 
     * solicitud en la que este oyente está interesado en el procesamiento de 
     * PhaseEvent eventos.
     * @return identificador
     */
    @Override
    public PhaseId getPhaseId() {
        return PhaseId.ANY_PHASE;
    }

    /**
     * Método que devuelve el nombre de un bean.
     * @param strViewId Cadena
     * @return strNombre
     */
    public String obtenerNombreBean(String strViewId) {
        String strNombre = strViewId.substring(1, strViewId.length() - 6);
        return strNombre;
    }
}
